/**
 * 首页
 * @description 展示轮播图和活动列表
 * @author 系统重构
 * @date 2023-10-01
 */
// import { get } from '../../utils/request';
// import { formatDate } from '../../utils/util';

// 使用钉钉小程序支持的方式引入模块
const util = require('../../utils/util');
const { request, get, post } = require('../../utils/request');
const { formatDate } = require('../../utils/util');

const app = getApp();
const moduleUrl = app.baseUrl + '/client/event';

Page({
  data: {
    // 基础URL
    baseUrl: '',
    // 轮播图配置
    carouselConfig: {
      indicatorDots: true,
      autoplay: true,
      vertical: false,
      interval: 3000,
      circular: true,
    },
    // 轮播图数据
    bannerList: [],
    // 活动列表
    event_list: [],
    // 加载状态，控制骨架屏显示
    loading: true,
    // 是否显示回到顶部按钮
    showTopBtn: false,
    // 当前页码
    currentPage: 1,
    // 每页数量
    pageSize: 10,
    // 是否有更多数据
    hasMore: true,
    // 是否正在刷新
    isRefreshing: false
  },

  /**
   * 页面加载时执行，只会执行一次
   * @param {Object} query - 页面参数
   */
  onLoad(query) {
    // 设置基础URL
    this.setData({
      baseUrl: app.baseUrl
    });
    
    // 获取并处理URL参数
    const { type, id } = query;
    if (type && id) {
      // 处理特定类型的跳转逻辑
      this.handleSpecialNavigation(type, id);
    }
    
    // 加载初始数据
    this.fetchData();
  },

  /**
   * 页面显示时执行，每次页面显示都会执行
   */
  onShow() {
    console.log('===== 页面显示 =====');
    
    // 页面每次显示时检查是否需要刷新数据
    if (app.globalData && app.globalData.needRefreshEventList) {
      console.log('===== 需要刷新活动列表 =====');
      this.fetchData();
      app.globalData.needRefreshEventList = false;
    }
  },

  /**
   * 页面初次渲染完成
   */
  onReady() {
    console.log('===== 页面初次渲染完成 =====');
  },

  /**
   * 页面隐藏
   */
  onHide() {
    console.log('===== 页面隐藏 =====');
  },

  /**
   * 页面卸载
   */
  onUnload() {
    console.log('===== 页面卸载 =====');
  },

  /**
   * 页面滚动时触发
   * @param {Object} e - 滚动事件对象
   */
  onPageScroll(e) {
    // 滚动距离大于 300 时显示回到顶部按钮
    const showTopBtn = e.scrollTop > 300;
    
    // 避免频繁 setData
    if (showTopBtn !== this.data.showTopBtn) {
      this.setData({
        showTopBtn
      });
    }
  },

  /**
   * 回到顶部
   */
  scrollToTop() {
    dd.pageScrollTo({
      scrollTop: 0,
      duration: 300
    });
  },

  /**
   * 下拉刷新触发函数
   */
  onPullDownRefresh() {
    console.log("===== 触发下拉刷新 =====");
    
    // 不需要手动设置isRefreshing，直接调用fetchData
    this.fetchData(true);
    
    // 不在这里调用dd.stopPullDownRefresh()
    // 而是在数据加载完成后再停止刷新动画
  },

  /**
   * 获取页面所有数据
   * @returns {Promise} 返回Promise对象
   */
  fetchData(refresh = false) {
    console.log(`===== 开始获取数据，是否刷新: ${refresh} =====`);
    
    // 设置加载状态
    this.setData({
      loading: true,
      // 如果是刷新，设置刷新状态
      isRefreshing: refresh ? true : this.data.isRefreshing
    });
    
    // 如果是刷新，重置页码
    if (refresh) {
      this.setData({
        currentPage: 1,
        hasMore: true,
        event_list: []
      });
    }
    
    // 并行请求轮播图和活动列表数据
    Promise.all([
      this.fetchBanners(),
      this.fetchActivities()
    ])
    .then(() => {
      this.setData({
        loading: false,
        isRefreshing: false
      });
      
      // 停止下拉刷新动画
      if (refresh) {
        dd.stopPullDownRefresh();
      }
    })
    .catch(error => {
      console.error('数据加载失败:', error);
      this.setData({
        loading: false,
        isRefreshing: false
      });
      
      // 停止下拉刷新动画
      if (refresh) {
        dd.stopPullDownRefresh();
      }
      
      dd.showToast({
        type: 'fail',
        content: '数据加载失败，请重试',
        duration: 2000
      });
    });
  },

  /**
   * 获取轮播图数据
   */
  fetchBanners() {
    return request({
      url: app.baseUrl + 'banner/banner/list',
      method: 'GET'
    })
    .then(res => {
      let bannerList = [];
      try {
        // 适应不同的API返回格式
        if (res && res.rows) {
          bannerList = res.rows;
        } else if (res && Array.isArray(res)) {
          bannerList = res;
        } else if (res && res.data && Array.isArray(res.data)) {
          bannerList = res.data;
        }
        
        console.log('轮播图数据获取成功', bannerList);
      } catch (error) {
        console.error('轮播图数据解析失败', error);
        bannerList = [];
      }
      
      this.setData({
        bannerList: bannerList
      });
    });
  },

  /**
   * 获取活动列表
   */
  fetchActivities() {
    const { currentPage, pageSize, event_list } = this.data;
    
    return request({
      url: moduleUrl + '/list',
      method: 'GET',
      data: {
        page: currentPage,
        pageSize: pageSize
      }
    })
    .then(res => {
      let newList = [];
      try {
        // 适应不同的API返回格式
        if (res && Array.isArray(res)) {
          newList = res;
        } else if (res && res.data && Array.isArray(res.data)) {
          newList = res.data;
        } else if (res && res.rows && Array.isArray(res.rows)) {
          newList = res.rows;
        } else if (res && res.list && Array.isArray(res.list)) {
          newList = res.list;
        }
        
        console.log('活动列表获取成功', newList);
      } catch (error) {
        console.error('活动列表解析失败', error);
        newList = [];
      }
      
      // 处理数据，如格式化日期等
      const formattedList = newList.map(item => ({
        ...item,
        formattedDate: item.startTime ? formatDate(item.startTime, 'YYYY-MM-DD') : '暂无日期',
        // 添加状态文本映射
        statusText: this.getStatusText(item.eventStatus)
      }));
      
      this.setData({
        event_list: currentPage === 1 ? formattedList : [...event_list, ...formattedList],
        hasMore: formattedList.length === pageSize
      });
    });
  },

  /**
   * 根据状态码获取状态文本
   * @param {number} status - 状态码
   * @returns {string} 状态文本
   */
  getStatusText(status) {
    switch (Number(status)) {
      case 1:
        return '未开始报名';
      case 2:
        return '报名中';
      case 3:
        return '等待开始';
      case 4:
        return '进行中';
      case 5:
        return '已结束';
      default:
        return '未知状态';
    }
  },

  /**
   * 页面触底事件
   */
  onReachBottom() {
    const { hasMore, isRefreshing, loading } = this.data;
    
    // 如果没有更多数据，或者正在刷新/加载中，则不操作
    if (!hasMore || isRefreshing || loading) {
      return;
    }
    
    this.setData({
      currentPage: this.data.currentPage + 1
    }, () => {
      // 仅加载活动列表，不重新加载轮播图
      this.setData({ loading: true });
      this.fetchActivities()
        .then(() => {
          this.setData({ loading: false });
        })
        .catch(error => {
          console.error('加载更多失败:', error);
          this.setData({ 
            loading: false,
            currentPage: this.data.currentPage - 1 // 失败时恢复页码
          });
          dd.showToast({
            type: 'fail',
            content: '加载更多失败',
            duration: 2000
          });
        });
    });
  },

  /**
   * 跳转到活动详情页
   */
  goToDetail(e) {
    const { id } = e.currentTarget.dataset;
    dd.navigateTo({
      url: `/pages/detail/detail?id=${id}`
    });
  },

  /**
   * 轮播图点击
   */
  onBannerClick(e) {
    const { id, url, type } = e.currentTarget.dataset;
    
    if (type === 'web' && url) {
      // 打开网页
      dd.navigateTo({
        url: `/pages/webview/webview?url=${encodeURIComponent(url)}`
      });
    } else if (id) {
      // 打开详情页
      dd.navigateTo({
        url: `/pages/detail/detail?id=${id}`
      });
    }
  },

  /**
   * 处理特殊页面导航
   */
  handleSpecialNavigation(type, id) {
    // 根据type和id跳转到不同页面
    console.log('处理特殊导航', type, id);
    // 实现相应的导航逻辑
  },

  /**
   * 图片加载完成事件
   * @param {Object} e - 事件对象
   */
  imageLoad(e) {
    console.log('图片加载完成', e);
  },

  /**
   * 图片加载失败事件
   * @param {Object} e - 事件对象
   */
  imageError(e) {
    console.error('图片加载失败', e);
  },

  /**
   * 点击事件
   * @param {Object} e - 事件对象
   */
  onTap(e) {
    const { name } = e.target.dataset;
    console.log('点击事件', name);
  },

  /**
   * 分享事件
   * @returns {Object} 分享配置
   */
  onShareAppMessage() {
    return {
      title: '公益活动平台',
      desc: '参与公益活动，共建美好社会',
      path: 'pages/index/index',
    };
  }
});
